/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package it.univaq.iw.jweb;

import it.univaq.iw.jweb.data.DataAccess;
import it.univaq.iw.jweb.data.EsperienzaRichiesta;
import it.univaq.iw.jweb.data.IstruzioneRichiesta;
import it.univaq.iw.jweb.data.LingueRichieste;
import it.univaq.iw.jweb.data.PreferenzaLavorativa;
import it.univaq.iw.jweb.data.ProfiloRicerca;
import it.univaq.iw.jweb.data.Province;
import it.univaq.iw.jweb.data.Regioni;
import it.univaq.iw.jweb.data.Servizio;
import it.univaq.iw.jweb.utils.ControlsHelpers;
import it.univaq.iw.jweb.utils.SecurityHelpers;
import it.univaq.iw.jweb.utils.TemplateManager;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author stefano
 */
public class InserisciProfiloRicerca extends HttpServlet {
   
    private TemplateManager tpl;
    private DataAccess da;

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);

        da = DataAccess.getInstance();
        tpl = TemplateManager.getInstance(getServletContext());
        tpl.setOutlineTemplate("outline");
        tpl.setDefaultData("author", "Del Vecchio - Bevini - Delfino");
        tpl.setDefaultData("homepage_url", "home");
        tpl.setDefaultData("logged", true);
    }

    private void selezionaServizi (String email) throws ServletException {

        List<Servizio> servizi = da.searchServiziGruppo(da.searchNomeGruppo(email));

        /* preparo i servizi in base allo stato del azienda */
        Iterator<Servizio> it = servizi.iterator();
        while (it.hasNext()) {
            Servizio servizio = it.next();
            if (da.hasProfiloRicerca(da.searchPIAziendaByMail(email))) { /* profilo ricerca completato */

                if (servizio.getNome().equalsIgnoreCase("inserisciProfiloRicerca")) {

                    it.remove();

                }

            } else { /* profilo ricerca incompleto */

                if (servizio.getNome().equalsIgnoreCase("modificaProfiloRicerca")) {

                    it.remove();

                }
            }
        }
        tpl.setDefaultData("servizi", servizi);

    }

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        HttpSession s = SecurityHelpers.checkSession(request);
        if (s == null) {

            response.sendRedirect("home");

        } else {

            selezionaServizi(s.getAttribute("email").toString());
            PrintWriter out = response.getWriter();
            Map datamodel = tpl.getDefaultDataModel();

            try {

                if (!request.getParameterMap().containsKey("t") || request.getParameterMap().containsKey("Reset")) {

                    datamodel.put("action","inserisciProfiloRicerca?t=m");
                    datamodel.put("titoli", da.getTitoli());
                    datamodel.put("province", Province.values());
                    datamodel.put("regioni", Regioni.values());
                    datamodel.put("settori", da.getSettoriLavorativi());
                    datamodel.put("lingue", da.getLingue());
                    tpl.process("formInserimentoProfiloRicerca", datamodel, out);
                    out.close();
                    return;

                } else {

                    /* dati generali */

                    int etaMin = 0;
                    if (request.getParameter("etaMin") != null && ControlsHelpers.controllaEta(request.getParameter("etaMin"))) {

                        etaMin = Integer.parseInt(request.getParameter("etaMin"));

                    }
                    int etaMax = 0;
                    if (request.getParameter("etaMax") != null && ControlsHelpers.controllaEta(request.getParameter("etaMax")) 
                            && Integer.parseInt(request.getParameter("etaMax")) > Integer.parseInt(request.getParameter("etaMin"))) {

                        etaMax = Integer.parseInt(request.getParameter("etaMax"));

                    }

                    String sesso = request.getParameter("sesso") != null ? request.getParameter("sesso") : new String();
                    String automunito = request.getParameter("automunito") != null ? request.getParameter("automunito") : new String();

                    ProfiloRicerca profilo = new ProfiloRicerca(etaMin,etaMax,sesso,automunito);
                    
                    /* dati riguardanti l'istruzione */

                    String titoloStudio = !request.getParameter("titoloStudio").equalsIgnoreCase("TITOLO DI STUDIO") ? request.getParameter("titoloStudio") : new String();

                    String settoreStudio = (request.getParameter("settoreStudio") != null && !request.getParameter("settoreStudio").isEmpty()) ? request.getParameter("settoreStudio") : new String();

                    int votoMin = 0;
                    if (request.getParameter("votoMin") != null && ControlsHelpers.controllaVotazione(request.getParameter("votoMin"))) {

                        votoMin = Integer.parseInt(request.getParameter("votoMin"));

                    }

                    int votoMax = 0;
                    if (request.getParameter("votoMax") != null && ControlsHelpers.controllaVotazione(request.getParameter("votoMax"))
                            && Integer.parseInt(request.getParameter("votoMax")) > Integer.parseInt(request.getParameter("votoMin"))) {

                        votoMax = Integer.parseInt(request.getParameter("votoMax"));

                    }

                    IstruzioneRichiesta istruzioneRichiesta = new IstruzioneRichiesta(votoMin,votoMax,settoreStudio,titoloStudio);

                    /* dati riguardanti le preferenze espresse */

                    String tipoImpiego = new String();
                    if (request.getParameter("tipoImpiego") != null) {
                        if (request.getParameter("tipoImpiego").equalsIgnoreCase("PT")) tipoImpiego = "Part Time";
                        if (request.getParameter("tipoImpiego").equalsIgnoreCase("FT")) tipoImpiego = "Full Time";
                        if (request.getParameter("tipoImpiego").equalsIgnoreCase("DR")) tipoImpiego = "Dirigenziale";
                    }

                    String provincia = !request.getParameter("provincia").equalsIgnoreCase("Provincia") ? request.getParameter("provincia") : new String();

                    String regione = !request.getParameter("regione").equalsIgnoreCase("Regione") ? request.getParameter("regione") : new String();

                    String settoreLavoro = !request.getParameter("settore").equalsIgnoreCase("Settore Lavorativo") ? request.getParameter("settore") : "";

                    PreferenzaLavorativa preferenzaLavorativa = new PreferenzaLavorativa(tipoImpiego,provincia,regione,settoreLavoro);

                    int mesiPeriodo = 0;

                    if (request.getParameter("mesi") != null && ControlsHelpers.controllaEta(request.getParameter("mesi"))) {

                        mesiPeriodo = Integer.parseInt(request.getParameter("mesi"));

                    }
                    
                    EsperienzaRichiesta esperienzaRichiesta = new EsperienzaRichiesta(mesiPeriodo,settoreLavoro);

                    /* dati riguardanti le lingue conosciute */

                    LingueRichieste lingue = new LingueRichieste();
                    
                    for (int i = 0; i < 3; i++) {
                        if (!request.getParameter("lingua" + i).equalsIgnoreCase("Selezionare Lingua")) {
                            lingue.getLingue().add(request.getParameter("lingua" + i));
                        }
                    }

                    String pi = da.searchPIAziendaByMail(s.getAttribute("email").toString());

                    if ((etaMin + etaMax + votoMin + votoMax > 0)
                            || !sesso.isEmpty()
                            || !automunito.isEmpty()
                            || !titoloStudio.isEmpty()
                            || !settoreStudio.isEmpty()
                            || !tipoImpiego.isEmpty()
                            || !provincia.isEmpty()
                            || !regione.isEmpty()
                            || !settoreLavoro.isEmpty()
                            || lingue.getLingue().size() > 0) {

                        profilo.setEsperienzaRichiesta(esperienzaRichiesta);
                        profilo.setIstruzioneRichiesta(istruzioneRichiesta);
                        profilo.setPreferenzaLavorativa(preferenzaLavorativa);
                        profilo.setLingueRichieste(lingue);

                        if (da.aggiungiProfiloRicerca(profilo,pi)) {
                            datamodel.put("messaggio", "Inserimento avvenuto con successo.");
                            selezionaServizi(s.getAttribute("email").toString());
                            tpl.process("home", datamodel, out);
                        } else {
                            response.sendRedirect("inserisciProfiloRicerca");
                        }
                        
                    } else {

                        datamodel.put("errore", "ATTENZIONE! Per proseguire nell'inserimento bisogna inserire qualcosa.");
                        datamodel.put("action","inserisciProfiloRicerca?t=m");
                        datamodel.put("titoli", da.getTitoli());
                        datamodel.put("province", Province.values());
                        datamodel.put("regioni", Regioni.values());
                        datamodel.put("settori", da.getSettoriLavorativi());
                        datamodel.put("lingue", da.getLingue());
                        tpl.process("formInserimentoProfiloRicerca", datamodel, out);
                        out.close();

                    }
                }

            } finally {
                out.close();
            }
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
